//
//  SHStatusDAL.swift
//  SHWeibo3
//
//  Created by teacher on 16/8/1.
//  Copyright © 2016年 teacher. All rights reserved.
//

import UIKit
// 微博首页数据处理层
class SHStatusDAL: NSObject {
    /*
        01 - 查询数据 -> 返回数据
                - 如果查询本地有数据  直接返回
                - 如果查询本地没有数据
                    - 网络请求数据
                    - 保存数据
        02 - 保存数据
    
        03 - 删除数据
    */
    // 检查本地是否有数据
    class func checkCache(sinceId: Int64, maxId: Int64, callback:(response:[[String: AnyObject]]?)->()){
        
        // 本地查询到的结果
        let result = SHStatusDAL.getCache(sinceId, maxId: maxId)
        // 代表本地有缓存数据
        if result?.count > 0 {
            print("本地数据")
            callback(response: result)
        }else{
            print("网络数据")
            // 本地没有缓存数据
            SHNetworkTools.sharedTools.homeLoadData(sinceId, maxId: maxId, success: { (response) -> () in
                // 判断他是否为nil 而且是否可以转成数组
                guard let res = response?["statuses"] as?[[String: AnyObject]] else{
                   callback(response: nil)
                    return
                }
                // 01 请求数据成功
                callback(response: res)
                // 02 保存数据
                SHStatusDAL.saveCache(res)
                }, failure: { (error) -> () in
                    print("请求数据失败:\(error)")
                    callback(response: nil)
            })
        }
    }
    
    // 查询微博数据
    class func getCache(sinceId: Int64, maxId: Int64) -> [[String: AnyObject]]?{
        // 判断用户uid是否存在
        guard let userId = SHUserAccountViewModel.sharedTools.userAccount?.uid else{
            print("用户没有登录")
            return nil
        }
        // 如果是第一次 需要从网络请求数据
        if sinceId <= 0 && maxId <= 0 {
            return nil
        }
        
        // 准备sql
        var sql = ""
        sql += "SELECT * FROM T_SHStatus\n"
        sql += "WHERE userid=\(userId)\n"
        if sinceId > 0 {
            sql += "AND statusid>\(sinceId)\n"
        }
        if maxId > 0 {
            sql += "AND statusid<=\(maxId)\n"
        }
        sql += "ORDER BY statusid DESC\n"
        sql += "LIMIT 20"
        
        // 得到查询结果
        let result = SHSQLManager.sharedTools.selectRecord(sql)
        // 创建一个临时可变数组
        var tempArray:[[String: AnyObject]] = [[String: AnyObject]]()
        // 遍历数组
        for dic in result {
            let dict = try! NSJSONSerialization.JSONObjectWithData(dic["status"] as! NSData, options: []) as! [String: AnyObject]
            // 保存字典
            tempArray.append(dict)
        }
        return tempArray
    }
    
    // 保存微博数据
    class func saveCache(response:[[String: AnyObject]]) {
        // 用户uid
        guard let userId = SHUserAccountViewModel.sharedTools.userAccount?.uid else{
            print("用户没有登录")
            return
        }
        // 准确sql
        let sql = "INSERT OR REPLACE INTO T_SHStatus (statusid,userid,status) VALUES (?,?,?)"
        // 执行sql
        SHSQLManager.sharedTools.queue.inTransaction { (db, rollback) -> Void in
            // 遍历数组
            for dic in response {
                // 微博id
                let statusId = dic["id"] as! NSNumber
                // 微博数据
                let status = try! NSJSONSerialization.dataWithJSONObject(dic, options: [])
                let result = db.executeUpdate(sql, withArgumentsInArray: [statusId,userId,status])
                if result {
                    print("保存数据成功")
                }else{
                    print("保存数据失败")
                    // 执行回滚
                    rollback.memory = true
                }
            }

        }
        
    }
    // 删除本地微博数据
    class func deleteCache() {
        // 日期
        let timeStr = NSDate.sinaDeleteTimeStr()
        // 准备sql
        let sql = "DELETE FROM T_SHStatus WHERE createtime<'\(timeStr)'"
        // 执行sql
        SHSQLManager.sharedTools.queue.inDatabase { (db) -> Void in
            let result = db.executeUpdate(sql, withArgumentsInArray: nil)
            if result {
                print("删除数据成功")
            }else{
                print("删除数据失败")
            }
        }
        
    }

}





